735807c7067edc4713428104833afce69cf0244d,src/freenet/node/RequestSender.java,RequestSender,finish,#number#PeerNode#boolean#,1548

Before Change


        	if(status != NOT_FINISHED) {
        		if(logMINOR) Logger.minor(this, "Status already set to "+status+" - returning on "+this+" would be setting "+code+" from "+next);
            	if(next != null) {
            		if(fromOfferedKey)
            			next.noLongerRoutingTo(origTag, true);
            		else
            			next.noLongerRoutingTo(origTag, false);
            	}
        		return;
        	}
            doOpennet = code == SUCCESS && !(fromOfferedKey || isSSK);
       		if(doOpennet)
       			origTag.waitingForOpennet(next);
       		else if(next != null) {
        		if(fromOfferedKey)
        			next.noLongerRoutingTo(origTag, true);
        		else
        			next.noLongerRoutingTo(origTag, false);
       		}

After Change


	 * @param next The node being routed to.
	 * @param fromOfferedKey Whether this was the result of fetching an offered key.
	 */
    private void finish(int code, PeerNode next, boolean fromOfferedKey) {
    	if(logMINOR) Logger.minor(this, "finish("+code+ ") on "+this+" from "+next);
        
    	boolean doOpennet;
    	
        synchronized(this) {
        	if(status != NOT_FINISHED) {
        		if(logMINOR) Logger.minor(this, "Status already set to "+status+" - returning on "+this+" would be setting "+code+" from "+next);
            	if(next != null) next.noLongerRoutingTo(origTag, fromOfferedKey);
        		return;
        	}
            doOpennet = code == SUCCESS && !(fromOfferedKey || isSSK);
       		if(doOpennet)
       			origTag.waitingForOpennet(next);
       		else if(next != null) next.noLongerRoutingTo(origTag, fromOfferedKey);
            status = code;
            if(status == SUCCESS)
            	successFrom = next;
            notifyAll();
        }
        
        if(status == SUCCESS) {
        	if((!isSSK) && transferTime > 0 && logMINOR) {
        		long timeTaken = System.currentTimeMillis() - startTime;
        		synchronized(avgTimeTaken) {
       				avgTimeTaken.report(timeTaken);
           			avgTimeTakenTransfer.report(transferTime);
       				if(logMINOR) Logger.minor(this, "Successful CHK request took "+timeTaken+" average "+avgTimeTaken);
           			if(logMINOR) Logger.minor(this, "Successful CHK request transfer "+transferTime+" average "+avgTimeTakenTransfer);
           			if(logMINOR) Logger.minor(this, "Search phase: median "+(avgTimeTaken.currentValue() - avgTimeTakenTransfer.currentValue())+"ms, mean "+(avgTimeTaken.meanValue() - avgTimeTakenTransfer.meanValue())+"ms");
        		}
        	}
        	if(next != null) {
        		next.onSuccess(false, isSSK);
        	}
        	// FIXME should this be called when fromOfferedKey??
       		node.nodeStats.requestCompleted(true, source != null, isSSK);
        	
       		try {
       			
       			//NOTE: because of the requesthandler implementation, this will block and wait
       			//      for downstream transfers on a CHK. The opennet stuff introduces
       			//      a delay of it's own if we don't get the expected message.
       			fireRequestSenderFinished(code);
       			
       			if(doOpennet) {
       				finishOpennet(next);
       			}
       		} finally {
       			if(doOpennet)
       				origTag.finishedWaitingForOpennet(next);
       		}
        } else {
        	node.nodeStats.requestCompleted(false, source != null, isSSK);
			fireRequestSenderFinished(code);
		}
        
    	if(doOpennet && next != null) next.noLongerRoutingTo(origTag, fromOfferedKey);
		
		synchronized(this) {
			opennetFinished = true;